package fr.bludwarf.skywarrior.global;

import java.util.Calendar;

import org.junit.Before;
import org.junit.Test;

import fr.bludwarf.skywarrior.evenements.Evenement;
import fr.bludwarf.skywarrior.exceptions.IleInconnue;
import fr.bludwarf.skywarrior.ile.TypeBatiment;
import fr.bludwarf.skywarrior.joueur.TypeVaisseau;

public class PartieTest {
	
	static
	{
	}
	
	private Partie getPartie(final Calendar date) {
		return getPartie(date, 139910);
	}
	
	private Partie getPartie(final Calendar date, final int id) {
		final Calendar calendar = date;
		
		final Partie partie = new Partie(id, calendar);
		
		partie.ajouterJoueur("Bludwarf", "Ile noire");
		partie.ajouterIle("Ile vierge");
		
		return partie;
	}

	@Test
	public void testAvancer() throws Exception {

		final Partie partie = getPartie(Calendar.getInstance());
		partie.lancer();
		
		partie.construire(TypeBatiment.CHAMPS, "Ile noire");
		
		// avance d'une heure
		partie.avancer();
		System.out.println(partie);
	}

	@Test
	public void testAvancer2() throws Exception {

		final Partie partie = getPartie(Calendar.getInstance());
		partie.lancer();

		partie.construire(TypeBatiment.CHAMPS, "Ile noire");
		partie.construire(TypeBatiment.CHAMPS, "Ile noire");
		
		// avance de deux heures
		partie.avancer();
		System.out.println(partie);
	}

	@Test
	public void testVraiPartie() throws Exception {

		final Calendar date = Calendar.getInstance();
		date.set(2011, 10, 14, 9, 53, 0); // 14/11/2011 09:53:00
		date.set(Calendar.MILLISECOND, 0);
		final Partie partie = getPartie(date, 140103);
		
		partie.lancer();
//		partie.lancer();

		partie.construire(TypeBatiment.CHAMPS, "Ile noire");
		partie.construire(TypeBatiment.CHAMPS, "Ile noire");
		partie.construire(TypeBatiment.ATELIER, "Ile noire");
		partie.construire(TypeVaisseau.APICOPTER, "Ile noire");
		partie.construire(TypeVaisseau.APICOPTER, "Ile noire");
		partie.construire(TypeVaisseau.APICOPTER, "Ile noire");
		partie.construire(TypeBatiment.CHAMPS, "Ile noire");
		
		// avance
		partie.avancer();
		
		// résultat
		/*
			14 nov. 09:53:00 : DEBUT PARTIE
			14 nov. 10:35:XX : CHAMPS terminé sur l'Ile noire
			14 nov. 11:17:XX : CHAMPS terminé sur l'Ile noire
			14 nov. 13:29:XX : ATELIER terminé sur l'Ile noire
			
			14 nov. 14:09:XX : APICOPTER terminé sur l'Ile noire
			14 nov. 14:49:XX : APICOPTER terminé sur l'Ile noire
			14 nov. 15:31:XX : APICOPTER terminé sur l'Ile noire
			
			14 nov. 16:05:XX : CHAMPS terminé sur l'Ile noire
		*/
		
		// etats
		System.out.println("");
		System.out.println("");
		System.out.println("");
		System.out.println(partie);
	}
	
	@Test
	public void testPartie140233() throws Exception {
		final Calendar date = Calendar.getInstance();
		date.set(2011, 10, 17, 9, 42, 12); // 17/11/2011 09:42:12
		date.set(Calendar.MILLISECOND, 0);
		final Partie partie = getPartie(date, 140233);
		
		partie.lancer();

		partie.construire(TypeBatiment.CHAMPS, "Ile noire");
		partie.construire(TypeBatiment.CHAMPS, "Ile noire");
		partie.construire(TypeBatiment.ATELIER, "Ile noire");
		partie.construire(TypeVaisseau.APICOPTER, "Ile noire");
		partie.construire(TypeVaisseau.APICOPTER, "Ile noire");
		partie.construire(TypeVaisseau.APICOPTER, "Ile noire");
		partie.construire(TypeBatiment.ECOLE, "Ile noire");
		partie.construire(TypeBatiment.CARRIERE, "Ile noire");
		
		partie.construire(TypeBatiment.POMPE, "Ile noire");
		partie.construire(TypeBatiment.CHAMPS, "Ile noire");
		partie.construire(TypeBatiment.CHAMPS, "Ile noire");
		partie.construire(TypeBatiment.CHAMPS, "Ile noire");
		partie.construire(TypeBatiment.CHAMPS, "Ile noire");
		partie.construire(TypeBatiment.CHAMPS, "Ile noire");
		partie.construire(TypeBatiment.ARCHITECTE, "Ile noire");
		partie.construire(TypeBatiment.TISSERAND, "Ile noire");
		partie.construire(TypeBatiment.MOULIN, "Ile noire");
		partie.construire(TypeBatiment.CASERNE, "Ile noire");
		partie.construire(TypeBatiment.CASERNE, "Ile noire");
		partie.construire(TypeBatiment.UNIVERSITE, "Ile noire");
		
		// avance
		partie.avancer();
		
		/*
		 * 10:31 Champs
		 * 11:13 Champs
		 * 13:25 Atelier
		 * 14:05 Apicopter
		 * 14:45 Apicopter
		 * 15:27 Apicopter
		 * 16:50 Ecole
		 */

		System.out.println(partie.getEtat("17/11/2011 14:43:00"));
//		System.out.println(partie.getEtatActuel());
		System.out.println(partie.getEtat("17/11/2011 18:46:00"));
	}
	
	@Test
	public void testPartie140291() throws Exception {
		final Calendar date = Calendar.getInstance();
		date.set(2011, 10, 18, 14, 44, 16); // 18/11/2011 14:44:16
		date.set(Calendar.MILLISECOND, 0);
		final Partie partie = getPartie(date, 140291);
		
		partie.lancer();

		partie.construire(TypeBatiment.CHAMPS, "Ile noire");
		partie.construire(TypeBatiment.CHAMPS, "Ile noire");
		partie.construire(TypeBatiment.ATELIER, "Ile noire");
		partie.construire(TypeVaisseau.APICOPTER, "Ile noire");
		partie.construire(TypeVaisseau.APICOPTER, "Ile noire");
		
		partie.construire(TypeBatiment.ECOLE, "Ile noire");
		
		partie.construire(TypeBatiment.CARRIERE, "Ile noire");
		partie.construire(TypeBatiment.POMPE, "Ile noire");
		partie.construire(TypeBatiment.POMPE, "Ile noire");
		
		partie.construire(TypeBatiment.CHAMPS, "Ile noire");
		partie.construire(TypeBatiment.ARCHITECTE, "Ile noire");
		partie.construire(TypeBatiment.TISSERAND, "Ile noire");
		partie.construire(TypeBatiment.MOULIN, "Ile noire");
		
		partie.construire(TypeBatiment.CASERNE, "Ile noire");
		partie.construire(TypeBatiment.CASERNE, "Ile noire");
		
		partie.construire(TypeBatiment.UNIVERSITE, "Ile noire");
		
		partie.construire(TypeBatiment.TOUR_DE_GUET, "Ile noire");
		
		partie.construire(20, TypeVaisseau.DRAKKAR, "Ile noire");
		
		// avance
		partie.avancer();
		
		/*
		 *
		 */

		System.out.println(partie.getEtatActuel());
	}
	
	@Test
	public void testPartie140539() throws Exception {
		final Calendar date = Calendar.getInstance();
		date.set(2011, 10, 23, 23, 52, 16); // 23/11/2011 23:52:16
		date.set(Calendar.MILLISECOND, 0);
		final Partie partie = getPartie(date, 140539);
		
		partie.lancer();

		partie.construire(TypeBatiment.CHAMPS, "Ile noire");
		partie.construire(TypeBatiment.CHAMPS, "Ile noire");
		partie.construire(TypeBatiment.ATELIER, "Ile noire");
		partie.construire(TypeVaisseau.APICOPTER, "Ile noire");
		partie.construire(TypeVaisseau.APICOPTER, "Ile noire");
		
		partie.construire(TypeBatiment.ECOLE, "Ile noire");
		
		partie.construire(TypeBatiment.CARRIERE, "Ile noire");
		partie.construire(TypeBatiment.POMPE, "Ile noire");
		partie.construire(TypeBatiment.POMPE, "Ile noire");
		
		partie.construire(TypeBatiment.CHAMPS, "Ile noire");
		partie.construire(TypeBatiment.ARCHITECTE, "Ile noire");
		partie.construire(TypeBatiment.TISSERAND, "Ile noire");
		partie.construire(TypeBatiment.MOULIN, "Ile noire");
		
		partie.construire(TypeBatiment.CASERNE, "Ile noire");
		partie.construire(TypeBatiment.CASERNE, "Ile noire");
		
		partie.construire(TypeBatiment.UNIVERSITE, "Ile noire");
		
		partie.construire(TypeBatiment.TOUR_DE_GUET, "Ile noire");
		
		partie.construire(20, TypeVaisseau.DRAKKAR, "Ile noire");
		
		// avance
		partie.avancer();
		
		/*
		 *
		 */

		System.out.println(partie.getEtatActuel());
		System.out.println(partie);
	}
	
	@Test
	public void testPartie140233Simu() throws Exception {
		final Calendar date = Calendar.getInstance();
		date.set(2011, 10, 17, 9, 42, 12); // 17/11/2011 09:42:12
		date.set(Calendar.MILLISECOND, 0);
		final Partie partie = getPartie(date, 140233);
		
		partie.lancer();

		// Colo
		partie.construire(TypeBatiment.CHAMPS, "Ile noire");
		partie.construire(TypeBatiment.CHAMPS, "Ile noire");
		partie.construire(TypeBatiment.ATELIER, "Ile noire");
		partie.construire(TypeVaisseau.APICOPTER, "Ile noire");
		partie.construire(TypeVaisseau.APICOPTER, "Ile noire");
		partie.construire(TypeVaisseau.APICOPTER, "Ile noire");
		
		// Recherche
		partie.construire(TypeBatiment.ECOLE, "Ile noire");
		
		// Ressources
		partie.construire(TypeBatiment.CARRIERE, "Ile noire");
		partie.construire(TypeBatiment.POMPE, "Ile noire");
		
		// Archi
		partie.construire(TypeBatiment.ARCHITECTE, "Ile noire");
		
		// Production de pop
		partie.construire(TypeBatiment.TISSERAND, "Ile noire");
		
		// Recherche
		partie.construire(TypeBatiment.UNIVERSITE, "Ile noire");
		
		// Production de pop
		partie.construire(TypeBatiment.MOULIN, "Ile noire");
		
		// avance
		partie.avancer();

		System.out.println(partie.getEtat());
	}

	@Test
	public void testNouvelleIle() throws Exception {

		final Partie partie = getPartie(Calendar.getInstance());
		final Calendar calendar = Calendar.getInstance();
		calendar.set(2011, 10, 1, 9, 3, 0);
		calendar.set(Calendar.MILLISECOND, 0);
		
		// Nouvelle ile
		final String newIle = "Ile bleue";
		
		partie.lancer();

		partie.construire(TypeBatiment.CHAMPS, newIle);
		partie.construire(TypeBatiment.CHAMPS, newIle);
		partie.construire(TypeBatiment.ATELIER, newIle);
		
		// avance de 5 heures
		partie.avancer();
		System.out.println(partie);
	}

//	@Test
//	public void testProchainEvenement() throws Exception {
//
//		final Partie partie = getPartie(Calendar.getInstance());
//		partie.lancer();
//		
//		partie.construire(Batiment.CHAMPS, "Ile noire");
//		final Evenement next = partie.prochainEvenement();
//		System.out.println("Prochain event:  " + next);
//		System.out.println(partie.getEtat());
//		
//		// On avance du temps du prochain évènement
//		partie.avancer();
//		System.out.println("On vient d'avancer de " + next.tempsRestant() + " s");
//		System.out.println(partie.getEtat());
//	}
	
	@Test
	public void testPartie25nov() throws Exception {
		final Calendar date = Calendar.getInstance();
		date.set(2011, 10, 25, 10, 00, 16); // 25/11/2011 10:00:16
		date.set(Calendar.MILLISECOND, 0);
		final Partie partie = getPartie(date, 140539); // TODO
		partie.ajouterIle("Ile vierge");
		
		partie.lancer();

		partie.construire(TypeBatiment.CHAMPS, "Ile noire");
		partie.construire(TypeBatiment.CHAMPS, "Ile noire");
		partie.construire(TypeBatiment.ATELIER, "Ile noire");
		partie.construire(TypeVaisseau.APICOPTER, "Ile noire");
		
		partie.construire(TypeBatiment.ECOLE, "Ile noire");
		
		partie.construire(TypeBatiment.CARRIERE, "Ile noire");
		partie.construire(TypeBatiment.POMPE, "Ile noire");
		partie.construire(TypeBatiment.POMPE, "Ile noire");

		partie.construire(TypeBatiment.CHAMPS, "Ile noire");
		partie.construire(TypeBatiment.ARCHITECTE, "Ile noire");
		partie.construire(TypeBatiment.TISSERAND, "Ile noire");
		partie.construire(TypeBatiment.MOULIN, "Ile noire");
		
		partie.construire(TypeBatiment.UNIVERSITE, "Ile noire");
		
		partie.construire(TypeBatiment.TOUR_DE_GUET, "Ile noire");
		
//		partie.construire(7, Batiment.CASERNE, "Ile noire");
		
		partie.construire(20, TypeVaisseau.DRAKKAR, "Ile noire");
		
		
		// Deuxième ile
		
		partie.coloniser("Bludwarf", "Ile vierge");
		partie.construire(2, TypeBatiment.CHAMPS, "Ile vierge");
		
		// avance
		partie.avancer();
		
		/*
		 *
		 */

//		System.out.println(partie.getEtatActuel());
		System.out.println(partie);
	}

}
